# 导入 re 模块，用于使用正则表达式进行字符串匹配
import re
# 导入 datetime 模块，用于处理日期和时间
import datetime
# 从 flask 模块导入 Blueprint、jsonify 和 request 类
# Blueprint 用于创建 Flask 应用的蓝图，方便组织路由
# jsonify 用于将 Python 字典或列表转换为 JSON 响应
# request 用于处理客户端的 HTTP 请求
from flask import Blueprint, jsonify, request
# 从 app 包中导入 LogService 类，用于记录日志
from app import LogService
# 从 utils 模块导入 create_response 函数和 StateCode 类
# create_response 用于创建统一格式的响应
# StateCode 用于定义响应状态码
from utils import create_response, StateCode

# 创建一个名为 'bank_server' 的蓝图
bank_bp = Blueprint('bank_server', __name__)

@bank_bp.route('/bank/card_verify', methods=['POST'])
def bankCardVerify():
    """
    验证银行卡号是否有效。

    该函数接收一个包含银行卡号的 POST 请求，
    并使用正则表达式验证银行卡号是否为 13 到 19 位的数字字符串。

    Returns:
        tuple: 包含 JSON 响应和 HTTP 状态码 200 的元组。
    """
    # 定义匹配 13 到 19 位数字字符串的正则表达式模式
    pattern = r'^\d{13,19}$'
    # 从请求的 JSON 数据中获取银行卡号
    number = request.json.get('bankCard')
    # 定义验证结果的字典
    state = {
        # 使用 re.match 函数验证银行卡号是否匹配模式
        "result": bool(re.match(pattern, number))
    }
    # 调用 LogService 的 log 方法记录日志
    LogService.log()
    # 使用 create_response 函数创建响应，包含成功状态码和验证结果
    return jsonify(create_response(StateCode.SUCCESS, data=state)), 200

@bank_bp.route('/bank/pay', methods=['POST'])
def pay():
    """
    模拟支付操作。

    该函数接收一个 POST 请求，模拟支付成功，并返回支付状态和支付时间。

    Returns:
        tuple: 包含 JSON 响应和 HTTP 状态码 200 的元组。
    """
    # 定义支付状态和支付时间的字典
    state = {"state": "successful", "pay_time": datetime.datetime.now()}
    # 调用 LogService 的 log 方法记录日志
    LogService.log()
    # 使用 create_response 函数创建响应，包含成功状态码和支付结果
    return jsonify(create_response(StateCode.SUCCESS, data=state)), 200

@bank_bp.route('/bank/query', methods=['POST'])
def query():
    """
    模拟查询支付状态操作。

    该函数接收一个 POST 请求，模拟查询成功，并返回支付状态和支付时间。

    Returns:
        tuple: 包含 JSON 响应和 HTTP 状态码 200 的元组。
    """
    # 定义查询结果的字典，包含支付状态和当前时间作为支付时间
    state = {"state": "successful", "pay_time": datetime.datetime.now()}
    # 调用 LogService 的 log 方法记录日志
    LogService.log()
    # 使用 create_response 函数创建响应，包含成功状态码和查询结果
    return jsonify(create_response(StateCode.SUCCESS, data=state)), 200